﻿//==============================================================================
// EventFlag 
//------------------------------------------------------------------------------
///**
//  @file       EventFlag.h
//  @brief      EventFlag
//  @author     Riki
//*/
//==============================================================================

#pragma once

namespace LNote
{
namespace Core
{
namespace Threading
{

//==============================================================================
// ■ EventFlag
//------------------------------------------------------------------------------
///**
//*	@brief		待ち合わせ機能を持つスレッドセーフな bool 型変数のクラス
//*/
//==============================================================================
class EventFlag
    : public Base::ReferenceObject
{
public:

	//----------------------------------------------------------------------
	///**
	//  @brief      コンストラクタ
	//  @param[in]  init_flag : フラグの初期状態
	//*/
	//----------------------------------------------------------------------
	explicit EventFlag( bool init_flag );

	/// デフォルトコンストラクタ (初期値は false)
    EventFlag();

	/// デストラクタ
	virtual ~EventFlag();

public:

	//----------------------------------------------------------------------
	///**
	//  @brief      値を true にする
	//  @par
	//              wait() によって待機しているスレッドをすべて再開します。
	//*/
	//----------------------------------------------------------------------
	void setTrue();

	//----------------------------------------------------------------------
	///**
	//  @brief      値を false にする
	//*/
	//----------------------------------------------------------------------
	void setFalse();

	//----------------------------------------------------------------------
	///**
	//  @brief      値が true かを判定する
	//  @note
	//              以前は const を付けていたが、gccではコンパイルできなかったためカット。
	//*/
	//----------------------------------------------------------------------
	bool isTrue();

	//----------------------------------------------------------------------
	///**
	//  @brief      true になるまで待機する
	//  @par
	//              値が true になるまで、呼び出したスレッドを待機させます。
	//              既に値が true の場合は何もしません。
	//*/
	//----------------------------------------------------------------------
    void wait();

private:

#if defined(LNOTE_WIN32)
    HANDLE              mHandle;
    mutable CRITICAL_SECTION mCS;
#else
    pthread_mutex_t     mMutex;
    pthread_cond_t      mWait;
    bool                mSignal;
#endif
};

} // namespace Threading
} // namespace Core
} // namespace LNote

//==============================================================================
//
//==============================================================================